package models;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

import play.mvc.Scope.Session;
import securesocial.provider.UserId;

@Entity
public class Nutri extends Usuario {
    
	private static final long serialVersionUID = 6097305379464736367L;
	
	@OneToMany(cascade=CascadeType.ALL, mappedBy="nutricionista")
	private List<Paciente> pacientes;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<PacienteAdquirido> pacientesAdquiridos = new ArrayList<PacienteAdquirido>();;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<TemplatePlan> templatePlanes = new ArrayList<TemplatePlan>();
	
	public Nutri(String email, String password, String nombre, UserId socialUserId) {
		super(email, password, nombre, socialUserId, Arrays.asList((ADietaRol)ADietaRol.find("byName", TipoRol.PACIENTE).first()));
	}
	
	/**
	 * Agrega el paciente al listado y establece el estado del paciente en Pendiente
	 */
	public void agregarPaciente(Paciente paciente) {
		// caso particular si vuelve a asignar al mismo paciente
		if (!getPacientes().contains(paciente)) {
			getPacientes().add(paciente);
		}
		paciente.setNutricionista(this);
		paciente.setEstadoPaciente(EstadoPaciente.PENDIENTE);
		PacienteAdquirido pacienteAdquirido = new PacienteAdquirido(paciente);
		pacienteAdquirido.save();
		getPacientesAdquiridos().add(pacienteAdquirido);
	}
	
	/**
	 * Elimina el paciente del listado y establece el estado del paciente en null
	 */
	public void desasignarPaciente(Paciente paciente) {
		getPacientes().remove(paciente);
	}
	
	public List<Paciente> getPacientes() {
		return pacientes;
	}
	
	public void setPacientes(List<Paciente> pacientes) {
		this.pacientes = pacientes;
	}
	
	public List<TemplatePlan> getTemplatePlanes() {
		return templatePlanes;
	}
	
	public void setTemplatePlanes(List<TemplatePlan> templatePlanes) {
		this.templatePlanes = templatePlanes;
	}
	
	@Override
	public Boolean isNutri() {
		return Boolean.TRUE;
	}

	@Override
	public void addNutriToSession(Session session) {
		session.put("nutri_nombre", this.getNombre());
		session.put("nutri_mail", this.getEmail());
	}

	@Override
	public Paciente getPacienteToCreateObjective(Long pacienteId) {
		return Paciente.findById(pacienteId);
	}

	public List<PacienteAdquirido> getPacientesAdquiridos() {
		return pacientesAdquiridos;
	}

	public void setPacientesAdquiridos(List<PacienteAdquirido> pacientesHistoricos) {
		this.pacientesAdquiridos = pacientesHistoricos;
	}

}
